package controllers

import (
	"net/http"
	"strconv"
	"time"

	"github.com/gin-gonic/gin"
	"github.com/go-starter/models"
)

// ProductController 商品控制器
type ProductController struct {
	// 这里可以添加依赖，如数据库连接等
}

// NewProductController 创建商品控制器实例
func NewProductController() *ProductController {
	return &ProductController{}
}

// GetProducts godoc
// @Summary      获取商品列表
// @Description  获取所有商品的列表
// @Tags         products
// @Accept       json
// @Produce      json
// @Success      200  {array}   models.ProductResponse
// @Router       /api/products [get]
func (pc *ProductController) GetProducts(c *gin.Context) {
	// 模拟从数据库获取商品列表
	products := []models.Product{
		{
			ID:          1,
			Name:        "商品1",
			Description: "这是商品1的描述",
			Price:       99.9,
			Stock:       100,
			CreatedAt:   time.Now(),
			UpdatedAt:   time.Now(),
		},
		{
			ID:          2,
			Name:        "商品2",
			Description: "这是商品2的描述",
			Price:       199.9,
			Stock:       50,
			CreatedAt:   time.Now(),
			UpdatedAt:   time.Now(),
		},
	}

	// 转换为响应模型
	responses := make([]models.ProductResponse, len(products))
	for i, product := range products {
		responses[i] = product.ToResponse()
	}

	c.JSON(http.StatusOK, responses)
}

// GetProduct godoc
// @Summary      获取单个商品
// @Description  根据ID获取商品信息
// @Tags         products
// @Accept       json
// @Produce      json
// @Param        id   path      int  true  "商品ID"
// @Success      200  {object}  models.ProductResponse
// @Failure      404  {object}  map[string]string
// @Router       /api/products/{id} [get]
func (pc *ProductController) GetProduct(c *gin.Context) {
	// 获取URL参数中的商品ID
	idStr := c.Param("id")
	id, err := strconv.Atoi(idStr)
	if err != nil {
		c.JSON(http.StatusBadRequest, gin.H{"error": "无效的商品ID"})
		return
	}

	// 模拟从数据库获取商品
	product := models.Product{
		ID:          uint(id),
		Name:        "商品" + idStr,
		Description: "这是商品" + idStr + "的描述",
		Price:       float64(id) * 100,
		Stock:       100,
		CreatedAt:   time.Now(),
		UpdatedAt:   time.Now(),
	}

	c.JSON(http.StatusOK, product.ToResponse())
}

// CreateProduct godoc
// @Summary      创建商品
// @Description  创建新商品
// @Tags         products
// @Accept       json
// @Produce      json
// @Param        product  body      models.Product  true  "商品信息"
// @Success      201      {object}  models.ProductResponse
// @Failure      400      {object}  map[string]string
// @Router       /api/products [post]
func (pc *ProductController) CreateProduct(c *gin.Context) {
	var product models.Product

	// 绑定JSON请求体到商品模型
	if err := c.ShouldBindJSON(&product); err != nil {
		c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
		return
	}

	// 设置创建时间和更新时间
	now := time.Now()
	product.CreatedAt = now
	product.UpdatedAt = now

	// 模拟保存到数据库并生成ID
	product.ID = 100

	c.JSON(http.StatusCreated, product.ToResponse())
}

// UpdateProduct godoc
// @Summary      更新商品
// @Description  根据ID更新商品信息
// @Tags         products
// @Accept       json
// @Produce      json
// @Param        id       path      int             true  "商品ID"
// @Param        product  body      models.Product  true  "商品信息"
// @Success      200      {object}  models.ProductResponse
// @Failure      400      {object}  map[string]string
// @Failure      404      {object}  map[string]string
// @Router       /api/products/{id} [put]
func (pc *ProductController) UpdateProduct(c *gin.Context) {
	// 获取URL参数中的商品ID
	idStr := c.Param("id")
	id, err := strconv.Atoi(idStr)
	if err != nil {
		c.JSON(http.StatusBadRequest, gin.H{"error": "无效的商品ID"})
		return
	}

	var product models.Product

	// 绑定JSON请求体到商品模型
	if err := c.ShouldBindJSON(&product); err != nil {
		c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
		return
	}

	// 设置ID和更新时间
	product.ID = uint(id)
	product.UpdatedAt = time.Now()

	c.JSON(http.StatusOK, product.ToResponse())
}

// DeleteProduct godoc
// @Summary      删除商品
// @Description  根据ID删除商品
// @Tags         products
// @Accept       json
// @Produce      json
// @Param        id   path      int  true  "商品ID"
// @Success      204  {object}  nil
// @Failure      400  {object}  map[string]string
// @Router       /api/products/{id} [delete]
func (pc *ProductController) DeleteProduct(c *gin.Context) {
	// 获取URL参数中的商品ID
	idStr := c.Param("id")
	_, err := strconv.Atoi(idStr)
	if err != nil {
		c.JSON(http.StatusBadRequest, gin.H{"error": "无效的商品ID"})
		return
	}

	// 模拟从数据库删除商品

	c.Status(http.StatusNoContent)
}